Raycast自作の拡張機能でAWSサービス名のtypoをサクッと確認・修正できるようにしてみた
こんにちは。AWS事業本部コンサルティング部に所属している今泉(@bun76235104)です。
私は以前textlint
というしくみを使ってAWSのサービス名の誤り・typoに気づける、typoを修正できるルールを作成していました。
以下のような形でVSCodeなどのエディタと組み合わせることでブログ執筆中のtypoを減らすことができます。
しかし、利用するにつれて以下のようなことを思うようになりました。
- ガッツリ記事を書くときはVSCodeひらいて良いけど、今書いている文章をさっとチェックしたい
- もうキーボードショートカットだけでチェックしたい
ということで、最近RaycastというMac向けのランチャーツールにハマっているので、サクッとtypoを修正できるように自作の拡張機能を作ってみました!
先に結論(こんな感じでサクッとチェック・修正できます)
- input欄にチェック・修正したい項目を入力
cmd+enter
でformをサブミット- 下に修正後のテキストと、修正内容が表示される
作り方
以下のブログと同じ手順でテンプレートから自作の拡張機能を作成し始めます。
Create Your First Extension - Raycast APIにあるようにRaycastでCreate Extension
コマンドを実行することでテンプレートから拡張機能のテンプレートが作られます。
私の場合テンプレートとしてForm
を選択しました。
この時点で以下のようにファイル群が作成されます。
. ├── CHANGELOG.md ├── README.md ├── assets │ └── command-icon.png ├── package-lock.json ├── package.json ├── src │ └── index.tsx └── tsconfig.json
今回はシンプルな作りですので、src/index.tsx
を直接変更して、他にファイルなどは作成しません。
まずpackage.json
に利用するtextlintのルールなどについて依存性を追記して、npm install
を済ませておきます。
"devDependencies": { "@raycast/eslint-config": "1.0.5", // 追加 "@textlint/kernel": "^13.3.2", // 追加 "@textlint/textlint-plugin-markdown": "^13.3.2", "@types/node": "18.8.3", "@types/react": "18.0.9", "eslint": "^7.32.0", "prettier": "^2.5.1", // 追加 "textlint": "^13.3.2", // 追加 "textlint-rule-aws-service-name": "^1.3.2", "typescript": "^4.4.3" },
後はindex.tsx
を以下のように記載するだけです。
import { useState } from "react"; import { Form, ActionPanel, Action, showToast, Toast } from "@raycast/api"; import { TextlintKernel, TextlintKernelOptions } from "@textlint/kernel"; import * as pluginMarkdown from "@textlint/textlint-plugin-markdown"; import * as awsRule from "textlint-rule-aws-service-name"; type Values = { input: string; }; export default function Command() { const [lintResult, setLintResult] = useState<string>(""); const [fixed, setFixed] = useState<string>(""); async function runTextLint(values: Values) { const kernel = new TextlintKernel(); const options = getOptions(); // textlintの実行 const result = await kernel.lintText(values.input, options); const messages = result.messages.map((message) => { return `${message.message}`; }); if (messages.length === 0) { showToast(Toast.Style.Success, "Check Result", "Input text is valid"); } const lintResult = messages.join("\n"); // チェックの結果を表示 setLintResult(lintResult); const fixedResult = await kernel.fixText(values.input, options); const fixed = fixedResult.output; // 修正後の文章を表示 setFixed(fixed); } return ( <Form actions={ <ActionPanel> <Action.SubmitForm onSubmit={runTextLint} /> </ActionPanel> } > // 入力用のテキストエリア <Form.TextArea id="input" title="Input" placeholder="Please enter the text you wish to check" /> <Form.Separator /> // 結果出力用のテキストエリア <Form.TextArea id="fixed" title="Fixed Result" value={fixed} /> <Form.TextArea id="lintResult" title="Check Result" value={lintResult} /> </Form> ); } function getOptions(): TextlintKernelOptions { const options: TextlintKernelOptions = { ext: ".md", plugins: [ { pluginId: "markdown", plugin: pluginMarkdown.default, }, ], rules: [ { ruleId: "aws-service-name", rule: awsRule.default, }, ], }; return options; }
npm run dev
を実行することにより以下のようなフォームが表示されますので、Input
のテキストエリアにチェックしたい文章を入力します。
後はcmd+enter
を押すことにより結果が出力されます。
これでFixed Result
の欄に表示されている結果をコピペするだけで、AWSサービス名のtypoを予防できます。(2023年4月28日現在、すべてのサービスに対応している訳ではありません)
さいごに
今回自分向けにRaycastの拡張機能を作成してみました!
とても簡単に作成できたので、創作意欲が湧いてきますね!
今回はあくまで「自作の拡張機能」としてパブリックに公開できていません!
Raycast Storeにてみなさんがワンクリックで利用できるようにするには、raycast/extensionsでPull Requestを作成してマージされる必要があります。
現在Pull Requestまで作成していますが、もし公開まで至ったら(至らないでも)、公開までの方法を別途記事にしたいと思います。
以上福岡オフィス所属の今泉でした。
最後まで読んでいただきありがとうございます。